package c12Swing;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

/**
 * 下面的tab示例想要在tab的头部（就是标签部分）添加一个关闭按键，并相应这个按键。
 * 并为frame设置菜单栏，可以选择需要不需要这种关闭按键。分成两个文件，
 * TestClosableJTabbedPane是框架和填充内容，TestClosableJTabbedPaneBtns是标签相关。
 *
 * @author ywlPC
 */
public class TestClosableJTabbedPane extends JFrame {

	private JTabbedPane pane = new JTabbedPane();
	private JMenuItem scrollTabItem;
	private JMenuItem componentTabItem;
	private final int numTab = 5;

	public TestClosableJTabbedPane(String title) {
		//设置frame标题名
		super(title);
		//设置关闭方式
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//创建菜单栏
		initMenu();
		//将tabpane添加到frame中
		add(pane);

	}

	//初始化tabpanel相关配置，并且用于resize的调用
	public void runTest() {
		//设置有关闭按键的标签
		componentTabItem.setSelected(true);

		//设置标签
		for (int i = 0; i < numTab; i++) {
			//标签名
			String name = "tab " + i;
			//创建标签
			pane.add(name, createContent(name));
			//初始化标签上的文字和Button
			initTabComponent(i);
		}


		//设置frame的大小
		setSize(new Dimension(500, 500));
		//将frame放到屏幕的正中央
		setLocationRelativeTo(null);
		//显示frame
		setVisible(true);


	}

	//创建标签内容部分
	private Component createContent(String name) {
		//创建一个panel，并设置布局为一个分块
		JPanel panel = new JPanel(new GridLayout(1, 1));
		//创建一个label
		JLabel label = new JLabel(name);
		//设置label的文本格式
		label.setHorizontalAlignment(JLabel.CENTER);
		//将label放入panel中
		panel.add(label);
		return panel;
	}

	//初始化带有关闭按钮的标签头部
	private void initTabComponent(int i) {
		//用这个函数可以初始化标签的头部
		pane.setTabComponentAt(i, new TestClosableJTabbedPaneBtns(pane));
	}

	//创建菜单栏
	private void initMenu() {
		//创建一个菜单条
		JMenuBar mb = new JMenuBar();

		//创建重叠tab选项
		scrollTabItem = new JCheckBoxMenuItem("重叠tab");
		//设置快捷键
		scrollTabItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
		//设置监听事件
		scrollTabItem.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (pane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
					pane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
				else
					pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
			}
		});

		//设置可关闭的标签的菜单
		componentTabItem = new JCheckBoxMenuItem("设置可关闭的tab");
		componentTabItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
		componentTabItem.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				for (int i = 0; i < numTab; i++) {
					if (componentTabItem.isSelected())
						initTabComponent(i);
					else
						pane.setTabComponentAt(i, null);
				}
			}
		});

		//设置重置标签
		JMenuItem reSetItem = new JMenuItem("重置");
		reSetItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK));
		reSetItem.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				runTest();
			}
		});

		//创建菜单
		JMenu menu = new JMenu("选项");
		//添加菜单项
		menu.add(componentTabItem);
		menu.add(scrollTabItem);
		menu.add(reSetItem);

		//添加菜单
		mb.add(menu);
		//添加菜单条（注意一个frame只能有一个菜单条，所以用set）
		setJMenuBar(mb);

	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				new TestClosableJTabbedPane("可关闭的tab测试").runTest();
			}
		});
	}


}